#include <QDebug>
#include "logmanager.h"


QMap<int,Logger*> LogManager::m_mapLoggers;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QRecursiveMutex LogManager::m_mutex;
#else
QMutex LogManager::m_mutex(QMutex::Recursive);
#endif

/************************************************
 * 功能：构造函数
 ************************************************/
LogManager::LogManager()
{

}

/************************************************
 * 功能：单例
 ************************************************/
LogManager* LogManager::instance()
{
    m_mutex.lock();

    static LogManager logManager;
    LogManager* pInstance = &logManager;

    m_mutex.unlock();

    return pInstance;
}

/************************************************
 * 功能：析构函数
 ************************************************/
LogManager::~LogManager()
{
    m_mutex.lock();

    QMapIterator<int,Logger*> i( m_mapLoggers );
    while( i.hasNext() )
    {
        i.next();
        delete i.value();
    }
    m_mapLoggers.clear();

    m_mutex.unlock();
}

/************************************************
 * 功能：添加日志（循环存储类型）
 * 输入参数：
 *      pInfo -- 日志文件文件配置
 * 返回：
 *      ERROR_NONE -- 成功
 *      其它 -- 失败
 ************************************************/
Logging::ErrorCode LogManager::addLogger( Logging::RotateConfigInfo* pInfo )
{
    Logging::ErrorCode code = Logging::ERROR_NONE;

    m_mutex.lock();

    if( m_mapLoggers.contains( pInfo->iCode ) )
    {
        code = Logging::LOG_ALREADY_EXIST;
        qWarning() << "LogManager::addLogger, log code " << pInfo->iCode << "already exist!";
    }
    else
    {
        Logger* pInstance = new Logger( pInfo );
        m_mapLoggers[pInfo->iCode] = pInstance;
    }

    m_mutex.unlock();

    return code;
}


/************************************************
 * 功能：添加日志（按时间存储类型）
 * 输入参数：
 *      pInfo -- 日志文件文件配置
 * 返回：
 *      ERROR_NONE -- 成功
 *      其它 -- 失败
 ************************************************/
Logging::ErrorCode LogManager::addLogger( Logging::TimeConfigInfo* pInfo )
{
    Logging::ErrorCode code = Logging::ERROR_NONE;

    m_mutex.lock();

    if( m_mapLoggers.contains( pInfo->iCode ) )
    {
        code = Logging::LOG_ALREADY_EXIST;
        qWarning() << "LogManager::addLogger, log code " << pInfo->iCode << "already exist!";
    }
    else
    {
        Logger* pInstance = new Logger( pInfo );
        m_mapLoggers[pInfo->iCode] = pInstance;
    }

    m_mutex.unlock();

    return code;
}

/************************************************
 * 功能：获取日志文件句柄
 * 输入参数：
 *      iCode -- 日志文件号
 * 返回：
 *      NULL -- 不存在
 *      其它 -- 配置文件句柄
 ************************************************/
Logger* LogManager::logger( int iCode )
{
    Logger* pInstance = nullptr;

    m_mutex.lock();

    if( m_mapLoggers.contains( iCode ) )
    {
        pInstance = m_mapLoggers[iCode];
    }
    else if( ( LOGGER_DEFAULT == iCode ) && ( m_mapLoggers.count() > 0 ) )
    {
        QList<int> keys = m_mapLoggers.keys();
        pInstance = m_mapLoggers[keys.at(0)];
    }
    else
    {
        qWarning() << "LogManager::logger: invalid code " << iCode;
    }

    m_mutex.unlock();

    return pInstance;
}


